package org.example.sword2offer.primary;

import java.util.HashMap;

/**
 * @author: lynn
 * @Descript: 复杂链表的复制
 * 输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），
 * 返回结果为复制后复杂链表的head。（注意，输出结果中请不要返回参数中的节点引用，否则判题程序会直接返回空）\
 * @date: 2021/3/13 0:22
 * @version: 1.0
 */
public class Q25_RandomListNodeCopy {
    public static void main(String[] args) {
        RandomListNode listNode=new RandomListNode(0);
        listNode.next=new RandomListNode(3);
        listNode.random=new RandomListNode(4);
    }

    //应用场景，以及用到的技术点，开始摸不到头脑: 考点链表复制
    private static RandomListNode doCopy(RandomListNode pHead){
        if(pHead == null){
            return null;
        }
        HashMap<RandomListNode, RandomListNode> map = new HashMap();
        //利用map存 原来节点的关系
        RandomListNode p=pHead;
        while (p!=null){
            RandomListNode cp = new RandomListNode(p.label);
            map.put(p,cp);
            p=p.next;
        }
        //处理 随机节点的关系
        p=pHead;
        while (p!=null){
            RandomListNode cp = map.get(p);
            cp.next = (p.next == null) ? null : map.get(p.next);
            cp.random = (p.random == null) ? null : map.get(p.random);
            p = p.next;
        }
        return map.get(pHead);
    }

    private static class RandomListNode{
        int label;
        RandomListNode next;
        RandomListNode random;
        public RandomListNode(int val){
            this.label =val;
        }
    }
}
